초반 챕터에서 다뤘던 동영상 제어 중, 동영상 속도를 시각적으로 이쁘게 조절 할 수 있는 Bar를 만들어 제어하는 기능을 구현해봤다.
 
 
로직 
const와 addEventListener (video, speed, speed-bar, mousemove 등등) 
mousemove에 따른 마우스 상대위치값 출력 
speed-bar 값에 적용하여 CSS 변경 
재생속도(playbackRate) 값 부여 
CSS 디테일 다듬기 (grab → grabbing 등) 
 
 
const와 addEventListener 
💡 mousedown, mouseup, mousemove 와 isDown 변수를 통해 드래그 이벤트 인식하도록 설정
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 const  video = document .querySelector('.flex' );const  stick = document .querySelector('.speed' );const  speedBar = document .querySelector('.speed-bar' );let  isDown = false ;function  isClicked ( )  {  isDown = true ;   console .log('clicked!' ); } function  cancelDown ( )  {  isDown = false ; } function  handleMove (e )  {  if  (!isDown) return ;   console .log("it's Moving~" ); } stick.addEventListener('mousedown' , isClicked); stick.addEventListener('mouseup' , cancelDown); stick.addEventListener('mousemove' , handleMove); 
 
 
mousemove에 따른 마우스 상대적 마우스 이동값 구하기
💡 e.pageY와 offsetTop, 그리고 offsetHeight를 활용해줘야 한다.
 
1 2 3 4 5 6 7 8 function  handleMove (e )  {  if  (!isDown) return ;   y = e.pageY - stick.offsetTop;    percentageY = y / stick.offsetHeight;      height = Math .round(percentageY * 100 ) + '%' ;    } 
 
 
speed-bar에 height 값 적용하여 CSS 변경 
💡 height값을 1% ~ 100%로 변환하여 CSS값에 넣어주면 끝
 
1 2 height = Math .round(percentageY * 100 ) + '%' ; speedBar.style.setProperty('height' , height); 
 
하지만, height뿐만 아니라 innerHTML 또한 변경해줘야 한다.
 
1 2 3 playbackRate = percentageY * (max - min) + min; textContent = playbackRate.toFixed(1 ) + 'x' ; speedBar.innerHTML = textContent; 
 
num.toFixed(n)
💡 숫자를 소숫점 n자리수 만큼 반올림 해준다
 
재생속도(playbackRate) 값 부여 
💡 위의 내용까지 잘 이해했다면, 굉장히 쉽다.
 
1 2 3 video.playbackRate = playbackRate; 
 
 
최종 완성 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 const  video = document .querySelector('.flex' );const  stick = document .querySelector('.speed' );const  speedBar = document .querySelector('.speed-bar' );let  isDown = false ;function  isClicked ( )  {  isDown = true ;   speedBar.style.setProperty('cursor' , 'grabbing' ); } function  cancelDown ( )  {  isDown = false ;   speedBar.style.setProperty('cursor' , 'grab' ); } function  handleMove (e )  {  if  (!isDown) return ;   const  max = 4 ;   const  min = 0.4 ;   y = e.pageY - stick.offsetTop;   percentageY = y / stick.offsetHeight;   height = Math .round(percentageY * 100 ) + '%' ;   speedBar.style.setProperty('height' , height);   playbackRate = percentageY * (max - min) + min;   textContent = playbackRate.toFixed(1 ) + 'x' ;   speedBar.innerHTML = textContent;   video.playbackRate = playbackRate; } stick.addEventListener('mousedown' , isClicked); stick.addEventListener('mouseup' , cancelDown); stick.addEventListener('mousemove' , handleMove);